home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 2 / CD ACTUAL VOL 2.iso / install / fips / restorrb / restorrb.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-09-10  |  6.3 KB  |  226 lines

  1. /* 
  2.     FIPS - the First nondestructive Interactive Partition Splitting program 
  3.     Module restorrb.c 
  4.  
  5.     Copyright (C) 1993 Arno Schaefer 
  6.  
  7.     This program is free software; you can redistribute it and/or modify 
  8.     it under the terms of the GNU General Public License as published by 
  9.     the Free Software Foundation; either version 1, or (at your option) 
  10.     any later version. 
  11.  
  12.     This program is distributed in the hope that it will be useful, 
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of 
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  15.     GNU General Public License for more details. 
  16.  
  17.     You should have received a copy of the GNU General Public License 
  18.     along with this program; if not, write to the Free Software 
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
  20. */ 
  21.  
  22. #include <stdio.h> 
  23. #include <io.h> 
  24. #include <stdlib.h> 
  25. #include <dos.h> 
  26. #include <bios.h> 
  27. #include <alloc.h> 
  28. #include <conio.h> 
  29. #include <ctype.h> 
  30.  
  31. #include "rtypes.h" 
  32.  
  33. #define DISK_INT 0x13 
  34.  
  35. #define RESET_DISK 0 
  36. #define WRITE_SECTOR 3 
  37. #define VERIFY_SECTOR 4 
  38.  
  39. #define DISK1 0x80 
  40.  
  41. /* ----------------------------------------------------------------------- */ 
  42. /* Copyright notice and version number                                     */ 
  43. /* ----------------------------------------------------------------------- */ 
  44.  
  45. void notice (void) 
  46.     printf ("\nFIPS version 1.1, Copyright (C) 1993/94 Arno Schaefer\n"); 
  47.     printf ("Module RESTORRB.EXE - Please read the file README.1ST\n"); 
  48.     printf ("FIPS comes with ABSOLUTELY NO WARRANTY, see file COPYING for details\n"); 
  49.     printf ("This is free software, and you are welcome to redistribute it\n"); 
  50.     printf ("under certain conditions; again see file COPYING for details.\n"); 
  51.  
  52. /* ----------------------------------------------------------------------- */ 
  53. /* Error Handling                                                          */ 
  54. /* ----------------------------------------------------------------------- */ 
  55.  
  56. int getx (void) 
  57.     int character = getch(); 
  58.  
  59.     if (character == 3) 
  60.     { 
  61.         printf ("\n"); 
  62.         exit (0); 
  63.     } 
  64.     return (character); 
  65.  
  66. void error (char *message) 
  67.     fprintf (stderr,"\nError: %s!\n",message); 
  68.     exit (-1); 
  69.  
  70. /* ----------------------------------------------------------------------- */ 
  71. /* BIOS calls                                                              */ 
  72. /* ----------------------------------------------------------------------- */ 
  73.  
  74. int reset_drives (void) 
  75.     union REGS regs; 
  76.  
  77.     regs.h.ah = RESET_DISK; 
  78.     regs.h.dl = DISK1; 
  79.     int86 (DISK_INT,®s,®s); 
  80.     if (regs.x.cflag) return (-1); 
  81.     return 0; 
  82.  
  83. /* ----------------------------------------------------------------------- */ 
  84. /* read / write sectors                                                    */ 
  85. /* ----------------------------------------------------------------------- */ 
  86.  
  87. int verify_sector (int drive_number,dword head,dword cylinder,dword sector,byte *buffer) 
  88.     if (biosdisk (VERIFY_SECTOR,drive_number,head,cylinder,sector,1,buffer)) return (-1); 
  89.     return 0; 
  90.  
  91. int write_sector (int drive_number,dword head,dword cylinder,dword sector,byte *buffer) 
  92.     int i; 
  93.     boolean done=false; 
  94.     for (i=0;i<3;i++) 
  95.     { 
  96.         if (!biosdisk (WRITE_SECTOR,drive_number,head,cylinder,sector,1,buffer)) 
  97.         { 
  98.             done=true; 
  99.             break; 
  100.         } 
  101.         reset_drives(); 
  102.     } 
  103.     if (!done) return (-1); 
  104.     return (verify_sector (drive_number,head,cylinder,sector,buffer)); 
  105.  
  106. int write_root_sector (int drive_number,byte *buffer) 
  107.     return (write_sector (drive_number,0,0,1,buffer)); 
  108.  
  109. /* ----------------------------------------------------------------------- */ 
  110. /* User Input                                                              */ 
  111. /* ----------------------------------------------------------------------- */ 
  112.  
  113. void ask_for_write_permission (void) 
  114.     int character = 'x'; 
  115.  
  116.     printf ("\nReady to write old root- and bootsector to disk\n"); 
  117.     printf ("Do you want to proceed (y/n): "); 
  118.  
  119.     while ((character != 'y') && (character != 'n')) character = getx(); 
  120.     printf ("%c\n",character); 
  121.     if (character == 'n') exit (0); 
  122.  
  123. /* ----------------------------------------------------------------------- */ 
  124. /* Main                                                                    */ 
  125. /* ----------------------------------------------------------------------- */ 
  126.  
  127. void main (void) 
  128.     byte rootsector[512]; 
  129.     byte bootsector[512]; 
  130.     int drive_number,partition_number,i; 
  131.     FILE *handle; 
  132.     dword head,cylinder,sector; 
  133.     char *filename = "a:\\rootboot.000"; 
  134.     int no_of_savefiles = 0; 
  135.     char first = 'x'; 
  136.  
  137.     notice(); 
  138.  
  139.     if (reset_drives ()) error ("Drive Initialization Failure"); 
  140.  
  141.     for (i='0';i<='9';i++) 
  142.     { 
  143.         filename[14] = i; 
  144.         if (access (filename,0) == 0) 
  145.         { 
  146.             if (first == 'x') first = i; 
  147.             no_of_savefiles++; 
  148.             printf ("found savefile %s\n",filename); 
  149.         } 
  150.     } 
  151.  
  152.     if (no_of_savefiles == 0) error ("No savefile ROOTBOOT.00? found on disk A:"); 
  153.  
  154.     if (no_of_savefiles > 1) 
  155.     { 
  156.         printf ("\nWhich file do you want to restore? "); 
  157.         while (true) 
  158.         { 
  159.             int c; 
  160.             if (isdigit (c = getx())) 
  161.             { 
  162.                 filename[14] = c; 
  163.                 if (access (filename,0) == 0) break; 
  164.             } 
  165.         } 
  166.     } 
  167.     else 
  168.     { 
  169.         filename[14] = first; 
  170.     } 
  171.  
  172.     if (no_of_savefiles > 1) 
  173.     { 
  174.         printf ("%c\n", filename[14]); 
  175.     } 
  176.  
  177.     if ((handle = fopen (filename,"rb")) == NULL) 
  178.         error ("Can't open file"); 
  179.  
  180.     for (i=0;i<512;i++) 
  181.     { 
  182.         int character = fgetc (handle); 
  183.         if (character == EOF) error ("Error reading file from disk"); 
  184.         *(rootsector + i) = character; 
  185.     } 
  186.     for (i=0;i<512;i++) 
  187.     { 
  188.         int character = fgetc (handle); 
  189.         if (character == EOF) error ("Error reading file from disk"); 
  190.         *(bootsector + i) = character; 
  191.     } 
  192.     if ((drive_number = fgetc (handle)) == EOF) error ("Error reading file from disk"); 
  193.     if ((partition_number = fgetc (handle)) == EOF) error ("Error reading file from disk"); 
  194.     if (fclose (handle)) error ("Error closing file"); 
  195.  
  196.     head = (dword) rootsector[0x1be+16*partition_number+1]; 
  197.     cylinder = (((dword) rootsector[0x1be+16*partition_number+2] << 2) & 0x300) 
  198.         | (dword) rootsector[0x1be+16*partition_number+3]; 
  199.     sector = (dword) rootsector[0x1be+16*partition_number+2] & 0x3f; 
  200.  
  201.     ask_for_write_permission(); 
  202.  
  203.     if (write_root_sector (drive_number,rootsector)) 
  204.         error ("Error writing rootsector"); 
  205.  
  206.     if (write_sector (drive_number,head,cylinder,sector,bootsector)) 
  207.         error ("Error writing bootsector"); 
  208.